package com.jddai.service;

import com.jddai.arithmetic.BRBInference;
import com.jddai.arithmetic.PSO_Model;
import com.jddai.dao.DataMapper;
import com.jddai.pojo.TrainData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Service
public class BRBService {

    @Autowired
    DataMapper dataMapper;

    public List<TrainData> getData(){
        List<TrainData> allData = dataMapper.getAllData();

        /*for(int i=0; i<allData.size(); i++){
            System.out.println(allData.get(i));
        }*/

        return allData;
    }

    public void getModel() throws IOException {
        List<TrainData> allData = getData();
        ArrayList<ArrayList<Double>> BTR_data = new ArrayList<>();
        ArrayList<ArrayList<Double>> Stl_data = new ArrayList<>();

        for(int i=0; i<allData.size(); i++){
            ArrayList<Double> btr_temp = new ArrayList<>();
            ArrayList<Double> stl_temp = new ArrayList<>();
            btr_temp.add(allData.get(i).getX1());
            stl_temp.add(allData.get(i).getX1());
            btr_temp.add(allData.get(i).getX2());
            stl_temp.add(allData.get(i).getX2());
            btr_temp.add(allData.get(i).getX3());
            stl_temp.add(allData.get(i).getX3());
            btr_temp.add(allData.get(i).getX4());
            stl_temp.add(allData.get(i).getX4());
            btr_temp.add(allData.get(i).getX5());
            stl_temp.add(allData.get(i).getX5());
            btr_temp.add(allData.get(i).getX6());
            stl_temp.add(allData.get(i).getX6());
            btr_temp.add(allData.get(i).getX7());
            stl_temp.add(allData.get(i).getX7());
            btr_temp.add(allData.get(i).getX8());
            stl_temp.add(allData.get(i).getX8());
            btr_temp.add(allData.get(i).getX9());
            stl_temp.add(allData.get(i).getX9());
            btr_temp.add(allData.get(i).getX10());
            stl_temp.add(allData.get(i).getX10());
            btr_temp.add(allData.get(i).getX11());
            stl_temp.add(allData.get(i).getX11());
            btr_temp.add(allData.get(i).getX12());
            stl_temp.add(allData.get(i).getX12());
            btr_temp.add(allData.get(i).getX13());
            stl_temp.add(allData.get(i).getX13());
            btr_temp.add(allData.get(i).getX14());
            stl_temp.add(allData.get(i).getX14());
            btr_temp.add(allData.get(i).getX15());
            stl_temp.add(allData.get(i).getX15());
            btr_temp.add(allData.get(i).getX16());
            stl_temp.add(allData.get(i).getX16());
            btr_temp.add(allData.get(i).getY1());
            stl_temp.add(allData.get(i).getY2());
            BTR_data.add(btr_temp);
            Stl_data.add(stl_temp);
        }

        /*for(int i=0; i<BTR_data.size();i++){
            for(int j=0; j<BTR_data.get(i).size(); j++){
                System.out.printf(BTR_data.get(i).get(j)+"\t");
            }
            System.out.println();
        }
        System.out.println();
        for(int i=0; i<BTR_data.size();i++){
            for(int j=0; j<BTR_data.get(i).size(); j++){
                System.out.printf(Stl_data.get(i).get(j)+"\t");
            }
            System.out.println();
        }*/



        ArrayList<ArrayList<Double>> Init_StlModel = new ArrayList<>();

        ArrayList<Double> Min = new ArrayList<>();
        Min.add(Math.random());
        Min.add(5.0);
        Min.add(0.0);
        Min.add(10.0);
        Min.add(5.0);
        Min.add(10.0);
        Min.add(20.0);
        Min.add(1204.0);
        Min.add(5026.0);
        Min.add(0.5);
        Min.add(0.5);
        Min.add(1.5);
        Min.add(0.0);
        Min.add(-1.0);
        Min.add(0.0);
        Min.add(65.0);
        Min.add(65.0);

        Min.add(Math.random());
        Min.add(Math.random());
        Min.add(Math.random());
        Min.add(Math.random());
        Min.add(Math.random());

        Init_StlModel.add(Min);

        ArrayList<Double> Max = new ArrayList<>();
        Max.add(Math.random());
        Max.add(30.0);
        Max.add(5.0);
        Max.add(22.0);
        Max.add(45.0);
        Max.add(30.0);
        Max.add(70.0);
        Max.add(3893.0);
        Max.add(15993.0);
        Max.add(3.5);
        Max.add(3.5);
        Max.add(10.0);
        Max.add(5.0);
        Max.add(3.49);
        Max.add(150.0);
        Max.add(95.0);
        Max.add(95.0);

        Max.add(Math.random());
        Max.add(Math.random());
        Max.add(Math.random());
        Max.add(Math.random());
        Max.add(Math.random());

        for(int i=1; i<4;i++){
            ArrayList<Double> Temp = new ArrayList<>();
            for(int j=0; j<1;j++){
                Temp.add(Math.random());
            }
            for(int j=1; j<1+16;j++){
                Temp.add(Math.random()*(Max.get(j) - Min.get(j))+Min.get(j));
            }
            for(int j=1+16; j<1+16+5;j++){
                Temp.add(Math.random());
            }
            Init_StlModel.add(Temp);
        }

        Init_StlModel.add(Max);

        /*for(int i=0; i<Init_StlModel.size();i++){
            for(int j=0; j<Init_StlModel.get(i).size(); j++){
                System.out.printf(Init_StlModel.get(i).get(j)+"\t");
            }
            System.out.println();
        }*/

        ArrayList<Double> uscale = new ArrayList<>();
        uscale.add(-15.0);
        uscale.add(-12.0);
        uscale.add(-9.0);
        uscale.add(-6.0);
        uscale.add(-3.0);

        PSO_Model pso_model = new PSO_Model(Init_StlModel,Stl_data,uscale);
        pso_model.Init();

    }






}
